package com.cg.bank.service;

import com.cg.bank.domain.Transaction;
import com.cg.bank.domain.User;
import com.cg.bank.util.TransferException;
import com.cg.bank.util.WithdrawalException;
import com.cg.bank.util.DepositException;
import com.cg.bank.util.Page;
import com.cg.bank.util.UserException;

import java.util.List;

/**
 * @author chunges
 * @version V1.0
 * @Description 业务层接口
 * @date 2018年6月12日 上午11:53:38
 */

public interface ManagerInterface {
	/**
	 * 用户注册
	 *
	 * @param user
	 * @return register result 注册结果 当用户已被注册将返回false
	 */
	void register(User user);

	/**
	 * 用户登录
	 *
	 * @param user
	 * @return login result 登录结果
	 * @throws UserException
	 *             用户异常(可能出现密码错误已登录等异常)
	 */
	User login(User user);

	/**
	 * 更新用户信息
	 *
	 * @param user
	 *            需要更新用户的信息
	 */
	void updateUserInformation(User user);

	/**
	 * 添加用户交易记录
	 *
	 * @param transaction
	 */
	void addTransactionRecord(Transaction transaction);

	/**
	 * 登出
	 *
	 * @param account
	 *            需要注销的账户
	 */
	void logout(User account);

	/**
	 * 注销账户
	 *
	 * @param account
	 */
	void logoffAccount(User account);

	/**
	 * 余额查询
	 *
	 * @return remaining 余额
	 */
	double queryBalance(User account);

	/**
	 * 根据账户查询用户信息
	 *
	 * @param account
	 * @return
	 */
	User queryUserByAccount(String account);

	/**
	 * 查询指定用户交易记录
	 *
	 * @param account 账户信息
	 * @param page 分页器
	 * @return
	 */
	List<Transaction> queryTransactionRecordByAccount(User account, Page page);
	
	/**
	 * 查询所有用户交易记录
	 *
	 * @return
	 */
	List<Transaction> queryAllTransactionRecord(Page page);
	
	/**
	 * 存款业务
	 *
	 * @param money
	 *            存款金额
	 * @return boolean deposit code 存款结果
	 * @throws DepositException
	 *             存款负数异常
	 */
	void deposit(User account, double money);

	/**
	 * 取款业务
	 *
	 * @param money
	 *            取款金额
	 * @return boolean withdrawal.jsp result 取款结果
	 * @throws WithdrawalException
	 *             取款超出异常
	 */
	void withdrawal(User account, double money);

	/**
	 * 用户转账
	 *
	 * @param fromUser
	 *            转账发起用户
	 * @param toUser
	 *            转账接收用户
	 * @return transfer result 转账结果
	 * @throws TransferException
	 *             非法转账金额异常
	 * @throws UserException
	 *             用户未注册异常
	 */
	void transfer(User fromUser, User toUser, double transferMoney);
	// Map<String, Object> queryTransactionRecodeByAccount(String account);
	// 贷款业务...

}